(* The main problem with this separation at the moment is evaluations. *)
(* Getting constraints out of actions should help quite a lot. *)
signature VALUE_PROTECTED =
sig
  include VALUE
   type valueSymbol
   type symbol sharing type valueSymbol = symbol (* Perdita! *)
   datatype value = Literal of int | Symbolic of valueSymbol
   datatype valueExp = LiteralExp of int | SymbolicExp of symbol
   (* Hide this! *)
   val valueSymbolLe : valueSymbol * valueSymbol -> bool
   val valueSymbolEq : valueSymbol * valueSymbol -> bool
   val symbolLe : symbol * symbol -> bool
   val symbolEq : symbol * symbol -> bool
   val valueLe : value * value -> bool
   val valueEq : value * value -> bool
   val expLe : valueExp * valueExp -> bool
   val makeEqualConstraint : value * value -> constraint
   val makeValue : string -> value
   val makeSymbol : string -> symbol
   val makeExpression : string -> valueExp
   val symbolString : symbol -> string
   val valueString : value -> string
   val expString : valueExp -> string
   val valueSymbolString : valueSymbol -> string

   val substVS : (valueSymbol * valueSymbol) -> valueSymbol -> valueSymbol
   val substC : (value * value) -> constraint -> constraint

   val filterConstraintV : valueSymbol list * constraint -> constraint
   val newSymbol : valueSymbol list -> valueSymbol
end



